// package关键字：声明当前类所在的包，用于组织和管理代码
// com.itheima.abstract1：包名，按照公司域名反写+项目名的格式命名
package com.itheima.abstract1;

// public：访问修饰符，表示这个类可以被其他任何类访问
// class：关键字，用于定义一个类
// AbstractDemo1：类名，采用驼峰命名法，首字母大写
// 这个类是一个演示抽象类使用的示例类
public class AbstractDemo1 {
    // public：访问修饰符
    // static：关键字，表示这个方法是静态方法，可以通过类名直接调用
    // void：返回值类型，表示这个方法没有返回值
    // main：方法名，这是Java程序的入口方法
    // String[] args：参数列表，接收命令行参数
    // 程序从这里开始执行
    public static void main(String[] args) {
        // 这是一个注释行，说明这段代码的学习目标
        // 注释：解释抽象类的核心特点
        // 注释：强调抽象类的重要特性
        // 这行代码被注释掉了，因为A是抽象类，不能直接创建对象
        // 如果去掉注释运行，会编译报错
        // A a = new A();  // 报错了
        // 注释：说明抽象类的主要用途
        // B：类名，应该是A抽象类的子类
        // b：变量名，用于存储对象的引用
        // new B()：创建B类的实例对象
        // 这行代码创建了抽象类A的子类B的对象
        B b = new B();
        
        // b：对象引用变量
        // setName()：调用对象的方法，这是从抽象类A继承的setter方法
        // "张三"：字符串参数，设置name属性的值
        // 这行代码设置对象b的name属性为"张三"
        b.setName("张三");
        
        // b：对象引用变量
        // setAge()：调用对象的方法，这是从抽象类A继承的setter方法
        // 18：整数参数，设置age属性的值
        // 这行代码设置对象b的age属性为18
        b.setAge(18);
        
        // System.out.println()：Java的输出语句
        // b.getName()：调用对象的getName()方法，获取name属性的值
        // +：字符串连接运算符
        // "---"：字符串，作为连接符
        // b.getAge()：调用对象的getAge()方法，获取age属性的值
        // 这行代码打印对象b的name和age属性值，格式为"张三---18"
        System.out.println(b.getName() + "---" + b.getAge());
        
        // b：对象引用变量
        // show()：调用对象的方法，这是从抽象类A继承并重写的抽象方法
        // 由于B类实现了抽象方法show()，所以可以调用
        b.show();
        
        // b：对象引用变量
        // show1()：调用对象的方法，这是从抽象类A继承的普通方法
        // 这行代码调用对象b的show1()方法
        b.show1();
    } // main方法结束标记
} // AbstractDemo1类结束标记



